package com.kfd.service;

import com.kfd.bean.Express;
import com.kfd.bean.lanren;
import com.kfd.dao.ExpressDao;
import com.kfd.daoImpl.ExpressDaoImpl;
import com.kfd.exception.DuplicateCodeException;
import com.kfd.exception.DuplicateNumberException;
import com.kfd.util.RandomUtil;
import com.kfd.util.SendSms;

import java.util.List;
import java.util.Map;

public class ExpressService {
    private static ExpressDao expressDao = new ExpressDaoImpl();
    /**
     * 返回控制台需要打印的内容（总快递数+新增）（代取件数+新增）
     *
     * @return 返回2条数据0（总快递数+新增）；1（代取件数+新增）
     */
    public static List<Map<String, Integer>> console() {
        return expressDao.console();
    }

    /**
     * 查询所有快递
     *
     * @param limit      是否开启分页；true表示开启分页
     * @param offset     sql语句起始下标
     * @param pageNumber 共查询多少条
     * @return 快递的集合
     */
    public static List<Express> findAll(boolean limit, int offset, int pageNumber) {
        return expressDao.findAll(limit,offset,pageNumber);
    }

    /**
     * 根据快递单号查询快递信息
     *
     * @param number 单号
     * @return 查询到的快递信息，有可能为空返回null，单号不存在
     */
    public static Express findByNumber(String number) {
        return expressDao.findByNumber(number);
    }

    /**
     * 根据取件码查询快递信息
     *
     * @param code 取件码
     * @return 查询到的快递信息，有可能为空返回null，取件码不存在
     */
    public static Express findByCode(String code) {
        return expressDao.findByCode(code);
    }

    /**
     * 根据用户手机号查询快递信息
     *
     * @param userPhone 用户手机号
     * @param status    表示查询的快递类型 [0、表示查询待取件的快递；1、表示查询已取件的快递；2、表示查询所有]
     * @return 查询到的快递信息，有可能为空返回null，手机号不存在快递
     */
    public static List<Express> findByUserPhone(String userPhone, int status) {
        return expressDao.findByUserPhone(userPhone,status);
    }

    public static List<Express> findBySysPhoneNo(String sysPhone, String status){
        return expressDao.findBySysPhoneNo(sysPhone,status);
    }

    /**
     * 根据快递员手机号查询快递信息
     *
     * @param sysPhone 快递员手机号
     * @return 查询到的快递信息，有可能为空返回null，手机号不存在快递
     */
    public static List<Express> findBySysPhone(String sysPhone) {
        return expressDao.findBySysPhone(sysPhone);
    }

    /**
     * 快递的录入
     *
     * @param express 快递信息
     * @return 返回是否录入成功
     */
    public static boolean insert(Express express,int status) {
        int code = RandomUtil.getCode();

        Express byCode = findByCode(String.valueOf(code));
        if(byCode != null){
            insert(express,status);
        }
        express.setCode(String.valueOf(code));
        try {
            boolean insert = expressDao.insert(express);
            if(insert){
                //录入成功；发送短信验证码提醒用户取件
                if(status !=1){
                    boolean send = SendSms.send(express.getUserphone(), express.getCode());
                }
            }
            return insert;
        } catch (DuplicateCodeException | DuplicateNumberException e) {
            return insert(express,status);
        }
    }

    /**
     * 快递的修改
     *
     * @param express 快递信息，id不变修改其他值（number,company,username,userphone）
     * @return 返回是否修改成功
     *
     * bug
     */
    public static boolean update(Express express) {
        if(express.getUserphone() != null){
            expressDao.delete(express.getId());
            insert(express,1);
            //如果为已取件则将其状态再修改为已取件
            boolean b = false;
            if(express.getStatus() == 1){
                b = expressDao.updateStatus(expressDao.findByNumber(express.getNumber()).getCode());
            }else {
                b = true;
            }
            return b;
        }else{
            boolean update = expressDao.update(express);
            Express e = expressDao.findByNumber(express.getNumber());
            if(express.getStatus() == 1){
                boolean b = expressDao.updateStatus(e.getCode());
            }
            return update;
        }
    }

    /**
     * 快递取件；更改快递的状态为1，表示已取件
     *
     * @param code 快递取件码
     * @return 返回是否修改成功
     */
    public static boolean updateStatus(String code) {
        return expressDao.updateStatus(code);
    }

    /**
     * 快递的删除
     *
     * @param id 快递的id
     * @return 返回是否删除成功
     */
    public static boolean delete(int id) {
        return expressDao.delete(id);
    }

    /**
     * 快递单号是否重复验证
     * 前端调用，如果重复则直接前端提醒重新录入
     *
     * @param number 快递单号
     * @return true是不重复，false重复需要重新输入
     */
    public static boolean numberRepetition(String number) {
        return expressDao.numberRepetition(number);
    }

    /**
     * 取件码重复验证，
     *
     * @param code 随机生成的取件码
     * @return true是不重复，false重复需要重新生成
     */
    public static boolean codeRepetition(String code) {
        return expressDao.codeRepetition(code);
    }

    public static List<lanren> getLanlist(String year, String month){
        return expressDao.getLanlist("'"+year+"%'","'"+year+"-"+month+"%'");
    }
}
